perm filename CREMEM[CRE,BGB]1 blob sn#104787 filedate 1974-06-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE CREMEM  -  MEMORY MANAGEMENT  -  BGB  -  16 APRIL 1973.
C00005 00003	SUBR(MKNODE)TYPE.		MAKE A NODE.
C00007 00004	SUBR(MORCOR).		GET MORE CORE.
C00009 00005	SUBR(MKBANK)CNT
C00012 00006	SUBR(SHRINK).		SHRINK NODE SPACE.
C00015 00007	
C00018 00008	SUBR(RELDWN)		RELOCATE DOWN.
C00021 00009	SUBR(RELUP)BNK		RELOCATE LINKS UP.
C00023 ENDMK
C⊗;
TITLE CREMEM  -  MEMORY MANAGEMENT  -  BGB  -  16 APRIL 1973.
	.INSERT MNCRE

;CRE NODE SPACE IS COMPOSED OF 4K BANKS.
	FILM↑:0
	BLKCNT↑:0↔AVAIL↑:0
	BREAK↑:	0		;SHRINK BREAK ADDRESS.
	BNKCNT↑:0		;BANK COUNTER.
	BANK↑:	BLOCK =34	;4K WORDS TO A BANK.
	FNAME↑: ASCIZ/TMP/↔0	;FILM NAME.
	FNAME6↑:SIXBIT/TMP/

;CAREYE STANDARD TV FILE IS =10496 WORDS LONG, 24400 OCTAL.
;=10 WORD HEADER, =216 ROWS OF =288 COLUMNS OF 6 BITS PER PIXEL.
;=118 WORD TRAILER.
	INTERN VSEG,HSEG,PAC,SKY,HI
	HI ←← 400000
	PAC ← HI ↔ HI ←← HI + =1728	;PICTURE ACCUMULATOR.
	VSEG← HI ↔ HI ←← HI + =1729	;VERTICAL SEGMENTS.
	HSEG← HI ↔ HI ←← HI + =1736	;HORIZONTAL SEGMENTS.
	SKY ← HI ↔ HI ←← HI + =31500	;SKY ARRAY.
;--------------------------------------------------------------------
		BLOCK =86	;NEGATIVE ROWS.
HEADER↑:	BLOCK =128
TVBUF↑:		BLOCK =10368	;TV BUFFER 6 BITS PER PIXEL.

;POINTERS TO TV BUFFER.
TV:	0
	POINT 6,-1,29	;COLUMN -2.
	POINT 6,-1,35	;COLUMN -1.
COLPTR↑:FOR I←0,=48{
	I+<POINT 6,0,05>↔I+<POINT 6,0,11>↔I+<POINT 6,0,17>
	I+<POINT 6,0,23>↔I+<POINT 6,0,29>↔I+<POINT 6,0,35>}
ROWPTR↑:FOR I←0,=216{
	I*=48+TVBUF}
	TVSEG:	0

;POINTERS TO SKY ARRAY.
	INTERN PUTSKY,GETSKY
	PUTSKY:	FOR I←0,=108{DIP 0,SKY+=289*I(3)
}↔		FOR I←1,=108{DAP 0,SKY+=289*I(3)
}↔	GETSKY:	FOR I←0,=108{CAR 1,SKY+=289*I(3)
}↔		FOR I←1,=108{CDR 1,SKY+=289*I(3)
}

QIMAGE↑:0↔BLOCK 8
QNODE↑:0↔BLOCK 8

HISTO↑:	BLOCK =64		;HISTOGRAM.
	FTVSIX↑:0↔FTVHIS↑:0	;FLAG TV SIX BIT & FLAG TV HISTOGRAM.
SUBR(MKNODE)TYPE.		MAKE A NODE.
BEGIN MKNODE;-----------------------------------------------------
	SKIPN 1,AVAIL↔CALL(MORCOR)	;NEXT AVAILABLE NODE.
	CDR(1)↔DAP AVAIL		;UPDATE AVAIL LSIT.
	DZM(1)↔AOS BLKCNT		;CLEAR LINK & COUNT NODES.
	POP P,0↔POP P,2(1)↔GO @0	;POP-PC & POP-TYPE & RETURN.
BEND MKNODE; BGB 10 JANUARY 1973 ---------------------------------

SUBR(KLNODE)NODE.		KILL A NODE.
BEGIN KLNODE;-----------------------------------------------------
	LAC 1,ARG1↔SOS BLKCNT
	DZM(1)↔HRLI(1)↔HRRI 1(1)↔BLT NODSIZ-1(1)
	LAC AVAIL↔HRRZM(1)↔HRRZM 1,AVAIL
	POP1J
BEND KLNODE; BGB 17 DECEMBER 1972 --------------------------------

SUBR(RINGIN)PART,WHOLE.		ATTACH A NODE IN A RING.
BEGIN RINGIN;-----------------------------------------------------
	LAC 1,ARG2↔LAC 3,ARG1
	DAD. 3,1↔SON 2,3
	JUMPE 2,[SON. 1,3
	DIP 1,(1)↔DAP 1,(1)↔POP2J]
	CAR 3,(2)
	DIP 3,(1)↔DAP 1,(3)
	DAP 2,(1)↔DIP 1,(2)
	POP2J↔LIT
BEND RINGIN; BGB 6 DECEMBER 1972 ---------------------------------
SUBR(MORCOR).		GET MORE CORE.
BEGIN MORCOR;-----------------------------------------------------
	ACCUMULATORS{PTR,SIZ}

;MAKE NEW NODES.
	PUSH P,PTR↔PUSH P,SIZ		;SAVE ACCUMULATORS.
	CALL(MKBANK,[1])		;MAKE 1 NEW BANK.
	CALL(MKALST)			;MAKE AVAIL LIST.

;MAKE FILM NODE.
	SKIPN FILM↔GO[
	  SETQ(FILM,{MKNODE,[FBIT+FILREL]})	;MAKE FILM NODE.
	  CCW. 1,1↔CW. 1,1↔GO .+1]		;FILM RING.

;RETURN NODE.
	LAC 1,AVAIL				;RETURN AN EMPTY NODE.
	POP P,SIZ↔POP P,PTR			;RESTORE AC'S.
	POP0J
;.................................................
;PLACE 512 NEW NODES ONTO THE AVAIL LIST.
MKALST:	LAC 1,PTR↔DIP 1,1
	ADD 1,[XWD NODSIZ,0]			;<NEXT NODE>,,<THIS NODE>.
	MOVEI 0,=511				;NUMBER OF NEW NODES.
	HLRZM 1,(1)				;PLACE A POINTER.
	ADD 1,[XWD NODSIZ,NODSIZ]		;ADVANCE POINTERS.
	SOJG 0,.-2
	EXCH PTR,AVAIL↔DAP PTR,(1)↔POP0J	;NEW AVAIL & LAST NODE.
BEND MORCOR; BGB 30 MAY 1974 --------------------------------------------------
SUBR(MKBANK)CNT
BEGIN MKBANK;------------------------------------------------------------------
	ACCUMULATORS{PTR,SIZ}
IFN SAIL{SEGNAM↔CAME[SIXBIT/*CRE*/]↔GO SAI2	;CHECK FOR *CRE* SEGMENT.
	DETSEG↔SKIPN 1,SAISEG↑↔GO L1		;SAISEG=0 ASSUMES LOW SEG SAIL.
	ATTSEG 1,↔FATAL(LOST SAISEG)}		;GET SAISEG.
IFE SAIL{
	LAC SIZ,ARG1↔ASH SIZ,=12		;SIZE ← CNT * =4096 WORDS.
	LAC PTR,JOBREL↑↔LAC PTR↔ADD SIZ		;TOP OF MEMORY PLUS SIZE.
	CORE↔GO[FATAL(NO MORE CORE.)]↔AOSA PTR}	;CORE FROM SYSTEM (IN ONE BLOCK).
L1:	IFE SAIL{ADDI PTR,=4096}		;NEXT BANK.
IFN SAIL{MOVEI SIZ,=4096↔CALL(CORGET↑)		;CORE FROM SAIL (BLOCK PER BANK).
	GO[FATAL(NO MORE CORE.)]}
	CALL(SUB1)↔SOSLE ARG1↔GO L1		;BANKS ARE 4K EACH.
IFN SAIL{SKIPN 1,CRESEG↑↔POP1J			;CHECK FOR *CRE* SEGMENT.
	DETSEG↔ATTSEG 1,↔FATAL(LOST CRESEG)}	;REATTACH *CRE* SEGMENT.
	POP1J
;...............................................;CLEAR BANK & SAVE ITS POINTER.
SUB1:	HRLI(PTR)↔HRRI 1(PTR)			;SETUP BLIT POINTER.
	DZM(PTR)↔BLT 0,=4095(PTR)		;CLEAR THE NEW BANK.
	AOS 1,BNKCNT↑↔SOJGE 1,.+3		;KEEP BANK TABLE SORTED.
	CAMG PTR,BANK(1)↔GO[			;TEST PTR GREATER THAN PREVIOUS.
	LAC BANK(1)↔DAC BANK+1(1)↔GO .-2]	;BUBBLE THE PTR'S SPACE DOWN.
	DAC PTR,BANK+1(1)↔POPJ P,		;INSERT PTR INTO BANK TABLE.
BEND MKBANK; BGB 30 MAY 1974 --------------------------------------------------
SUBR(SHRINK).		SHRINK NODE SPACE.
BEGIN SHRINK;------------------------------------------------------------------
	ACCUMULATORS{I,J,K,HOLE,BRK,NODE,L,R,S12,ECNT,WRDCNT}

;AMOUNT OF POTENTIALLY FREE SPACE.
	LAC BNKCNT↔ASH 0,9			;TOTAL NUMBER OF NODES.
	SUB BLKCNT↔DAC 1			;TOTAL NUMBER OF EMPTY NODES.
	ASH -=9↔DAC EBANKS#			;NUMBER OF EMPTY BANKS.
	ASH  =9↔SUB 1,0↔DAC 1,ECNT		;NEW NUMBER OF EMPTY NODES.
	ASH 1,=3↔DAC 1,WRDCNT			;NUMBER OF EMPTY WORDS.

;COMPUTE BRK ADDRESS.
L3:	LAC 1,BNKCNT↔SUB 1,EBANKS↔DAC 1,BNKCNT	;NUMBER OF BANKS REMAINING.
	LAC BRK,BANK(1)↔ADDI BRK,=4096		;TOP OF LAST BANK.
	SUB BRK,WRDCNT↔DAC BRK,BREAK		;LESS THE EMPTY SPACE.

;PURGE THE AVAIL LIST OF DEAD EMPTY NODES.
	MOVEI J,AVAIL				;PRE-FIRST EMPTY NODE.
	LAC I,J↔SKIPN J,(I)↔GO .+6		;ADVANCE DOWN THE LIST.
	CAMGE J,BRK↔GO .-4			;IF LOC(EMPTY) ≥ BRK THEN
	LAC J,(J)↔DAP J,(I)			;REMOVE NODE FROM LIST.
	JUMPN J,.-4				;CONTINUE.

;FOR EACH DEAD BANK - MOVE THE HIGH NODES INTO LOWER POSITIONS.
	MOVN I,EBANKS↔SOS I			;AOBJN POINTER TO THE DEAD BANKS.
	MOVSS I↔HRR I,BNKCNT
	LAC J,ECNT↔LAC NODE,BRK↔GO LL2		;PARTIALLY EMPTY BANK PARAMETERS.
LL1:	LAC NODE,BANK(I)↔MOVEI J,=512		;COMPLETLY EMPTY BANK PARAMETERS.
LL2:	SKIPN 2(NODE)↔GO LL3			;IGNORE EMPTY NODES.
	LAC HOLE,AVAIL↔CDR(HOLE)↔DAC AVAIL	;GET AN EMPTY NODE BELOW BRK.
	DIP NODE,0↔DAP HOLE,0			;MOVE THE NODE'S CONTENTS DOWN.
	BLT 0,NODSIZ-1(HOLE)
	HRRZM HOLE,0(NODE)			;LEAVE NODE'S NEW ADDRESS AT OLD.
LL3:	ADDI NODE,NODSIZ↔SOJG J,LL2		;ADVANCE TO NEXT NODE.
	AOBJN I,LL1				;ADVANCE TO NEXT BANK.

;FOR EACH LIVE BANK - REPLACE LINKS WITH THEIR NEW VALUES.
	MOVN I,BNKCNT↔HRLZS I↔AOS I		;FIRST BANK & NUMBER OF BANKS.
L.1:	LAC NODE,BANK(I)↔MOVEI J,=512		;FIRST NODE & NODES PER BANK.
L.2:	HRLZ L,2(NODE)				;LEFT RELOC BITS OF NODE.
	HRLZ R,2(NODE)↔LSH R,9			;RIGHT RELOC BITS OF NODE.
	HRLI NODE,-NODSIZ			;FOREACH WORD OF THE NODE.
L.3:	JUMPL L,[CAR 1,(NODE)↔CAML 1,BRK	
	  LAC 1,(1)↔DIP 1,(NODE)↔GO .+1]	;UPDATE LINK DOWN.
	JUMPL R,[CDR 1,(NODE)↔CAML 1,BRK
	  LAC 1,(1)↔DAP 1,(NODE)↔GO .+1]	;UPDATE LINK DOWN.
	ROTC L,1↔AOBJN NODE,L.3			;ADVANCE A WORD.
	CAML NODE,BRK↔GO .+3			;TEST FOR FINAL EXIT.
	SOJG J,L.2				;ADVANCE A NODE.
	AOBJN I,L.1				;ADVANCE A BANK.
	LAC 1,QIMAGE↑↔CAML 1,BRK		;REFRESH IMAGE.
	LAC 1,(1)↔DAC 1,QIMAGE

;PLACE THE EMPTY SPACE OF LAST BANK INTO AVAIL LIST.
	JUMPE ECNT,L4				;EXACT SHRINK - EMPTY AVAIL LIST.
	SETZM(BRK)↔DIP BRK,BRK			;LOWEST EMPTY NODE.
	ADDI WRDCNT,-1(BRK)			;TOP OF PARTIALLY FILLED BANK.
	LAC BRK↔AOS↔BLT(WRDCNT)			;CLEAR THE EMPTY SPACE.
	ADDI BRK,NODSIZ↔GO .+3			;XWD PREVIOUS,,CURRENT NODE.
	HLRZM BRK,(BRK)				;CURRENT POINTS AT PREVIOUS.
	ADD BRK,[XWD NODSIZ,NODSIZ]		;ADVANCE A NODE.
	SOJG ECNT,.-2
L4:	HLRZM BRK,AVAIL				;AVAIL POINTS AT LAST (OR ZERO).

;RETURN DEAD BANKS TO THE SYSTEM OR TO SAIL.
	IFE SAIL{LAC 1,BNKCNT↔LAC BANK(1)
	ADDI =4095↔CORE↔HALT↔POP0J		;SHRINK SYSTEM CORE.}
	IFN SAIL{SKIPN K,EBANKS↔POP0J		;RETURN HIGH BANKS TO SAIL.
	MOVNS K↔MOVSS K↔HRR K,BNKCNT↔AOS K
	LAC 2,BANK(K)↔CALL(CORREL↑)↔AOBJN K,.-2↔POP0J}
	LIT
BEND SHRINK;BGB 26 MAY 1974----------------------------------------------------
SUBR(RELDWN)		;RELOCATE DOWN.
BEGIN RELDWN;------------------------------------------------------------------
	ACCUMULATORS{I,J,K,L,R,NODE,BP}
	LAC BP,[POINT 5,1,=23]			;HIGH ORDER ADDRESS BITS.
	LAC[XWD BADR,BADR+1]			;CLEAR THE BANK ADDRESS TABLE.
	SETZM BADR↔BLT BADR+=65

;SETUP THE BANK ADDRESS TABLE.
	SETZ↔MOVN I,BNKCNT↔HRLZS I↔AOS I	;FIRST BANK & NUMBER OF BANKS.
L0:	LAC 1,BANK(I)↔LDB K,BP↔DAC 1,BADR(K)	;BANK POINTER INTO TABLE AT K.
	DAC 0,BADR+=32(K)↔ADDI =4096		;BANK'S DISPLACEMENT IN FILE.
	AOBJN I,L0↔HLLOS BADR+1(K)		;MARK END OF TABLE WITH 777777

;FOREACH BANK - RELOCATE ALL THE LINKS DOWNWARDS.
	MOVN I,BNKCNT↔HRLZS I↔AOS I		;FIRST BANK & NUMBER OF BANKS.
L1:	LAC NODE,BANK(I)↔MOVEI J,=512		;FIRST NODE & NODES PER BANK.
L2:	HRLZ L,2(NODE)				;LEFT RELOC BITS OF NODE.
	HRLZ R,2(NODE)↔LSH R,9			;RIGHT RELOC BITS OF NODE.
	HRLI NODE,-NODSIZ			;FOREACH WORD OF THE NODE.

L3:	JUMPL L,[CAR 1,(NODE)↔JUMPE 1,.+1	;FETCH NON-ZERO LINK.
	  LDB K,BP↔CAMGE 1,BADR(K)↔SOS K	;FIND LINK'S BASE ADDRESS.
	  SUB 1,BADR(K)↔ADD 1,BADR+=32(K)
	  DIP 1,(NODE)↔GO .+1]			;UPDATE LINK DOWN.
	JUMPL R,[CDR 1,(NODE)↔JUMPE 1,.+1	;FETCH NON-ZERO LINK.
	  LDB K,BP↔CAMGE 1,BADR(K)↔SOS K	;FIND LINK'S BASE ADDRESS.
	  SUB 1,BADR(K)↔ADD 1,BADR+=32(K)
	  DAP 1,(NODE)↔GO .+1]			;UPDATE LINK DOWN.

	ROTC L,1↔AOBJN NODE,L3			;ADVANCE A WORD.
	CAML NODE,BREAK↔POP0J			;TEST FOR FINAL EXIT.
	SOJG J,L2				;ADVANCE A NODE.
	AOBJN I,L1↔POP0J			;ADVANCE A BANK OR EXIT.

BADR:	BLOCK =66	;BANK ADDRESS TABLE ORDER BY HIGH ORDER BITS.
LIT
BEND RELDWN; BGB 27 MAY 1974 --------------------------------------------------

SUBR(RELUP)BNK		;RELOCATE LINKS UP.
BEGIN RELUP;-------------------------------------------------------------------
	ACCUMULATORS{I,J,K,L,R,NODE,BP}		;COUNTERS I,J,K;REL-BITS;PTR'S.
	LAC BP,[POINT 5,1,=23]			;HIGH ORDER ADDRESS BITS.
	MOVN I,BNKCNT↔HRLZS I↔HRR I,ARG1	;FIRST BANK & NUMBER OF BANKS.
L1:	LAC NODE,BANK(I)↔MOVEI J,=512		;FIRST NODE & NODES PER BANK.
L2:	HRLZ L,2(NODE)				;LEFT RELOC BITS OF NODE.
	HRLZ R,2(NODE)↔LSH R,9			;RIGHT RELOC BITS OF NODE.
	HRLI NODE,-NODSIZ			;FOREACH WORD OF THE NODE.
L3:	JUMPL L,[CAR 1,(NODE)↔JUMPE 1,.+1	;FETCH NON-ZERO LINK.
	  LDB K,BP↔ADD K,ARG1↔ANDI 1,7777	;FIND THE LINKS BASE ADDRESS.
	  ADD 1,BANK(K)↔DIP 1,(NODE)↔GO .+1]	;UPDATE LINK UP.
	JUMPL R,[CDR 1,(NODE)↔JUMPE 1,.+1	;FETCH NON-ZERO LINK.
	  LDB K,BP↔ADD K,ARG1↔ANDI 1,7777	;FIND LINK'S BASE ADDRESS.
	  ADD 1,BANK(K)↔DAP 1,(NODE)↔GO .+1]	;UPDATE LINK UP.
	ROTC L,1↔AOBJN NODE,L3			;ADVANCE A WORD.
	CAML NODE,BREAK↔POP1J			;TEST FOR FINAL EXIT.
	SOJG J,L2				;ADVANCE A NODE.
	AOBJN I,L1↔POP1J			;ADVANCE A BANK OR EXIT.
BEND RELUP; BGB 27 MAY 1974 ---------------------------------------------------
END